#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <math.h>
#include <time.h>


typedef char* string;

void fillFileASC(FILE* file, int N);

void fillFileDESC (FILE* file, int N);

void fillFileRANDOM (FILE* file, int N);

// ----------------------------------------------------------------------------

int main (int argc, string argv []) {
    
    int N = 0;
    
    for (N = 0; N < 17; N++){

        
        // Defino el directorio del exponente N.
        char NStr [3];
        sprintf (NStr, "%d", N);
        
        fprintf (stdout, "\n %s %s \n", "Iteracion: ", NStr);
                
        char filePath [strlen("./data/") + strlen(NStr) + strlen ("/") + 1];
        filePath [0] = '\0';
        strcat (filePath, "./data/");
        strcat (filePath, NStr);
        strcat (filePath, "/");

        fprintf (stdout, "\n %s %s \n", "Genero el directorio: ", filePath);        

        mkdir (filePath, S_IRWXU);
        
        // Genero el archivo A.dat
        string fileFullName = malloc (strlen(filePath) +  strlen("A.dat") +  1);
        fileFullName [0] = '\0';
        strcat (fileFullName, filePath);
        strcat(fileFullName, "A.dat");

        fprintf (stdout, "\n %s %s \n", "Genero el full path: ", fileFullName);
                
        FILE* file = fopen (fileFullName, "w");
        if (file)
        {
            fprintf (stdout, " \n%s %s \n", "Se popula el archivo ", fileFullName);
            fillFileASC(file, N);
            fclose(file);
        }
        else
        {
            fprintf (stdout, " \n%s %s \n", "Fallo al crear el archivo ", fileFullName);
            exit (1);
        }
        
        free (fileFullName);
        
        // Genero el archivo B.dat
        fileFullName = malloc (strlen(filePath) +  strlen("B.dat") +  1);
        strcat (fileFullName, filePath);
        strcat(fileFullName, "B.dat");
        
        file = fopen (fileFullName, "w");
        
        fillFileDESC (file, N);
        
        fclose(file);
        
        free (fileFullName);

        // Se deben generar los 10 archivos random.
        int i = 1; // Archivo sub i.
        for (i = 1; i <= 10; i++)
        {
            // Defino el nombre del archivo i.
            char iStr [20];
            iStr [0] = '\0';
            sprintf (iStr, "%d.dat", i);            
            
            // Genero el archivo i.dat
            fileFullName = malloc (strlen(filePath) +  strlen(iStr) +  1);
            fileFullName [0] = '\0';
            strcat (fileFullName, filePath);
            strcat(fileFullName, iStr);
            
            fprintf (stdout, "%s", fileFullName);
                        
            file = fopen (fileFullName, "w");
            
            fillFileRANDOM (file, N);
            
            fclose(file);
            
            free (fileFullName);            
        }
    }
    
} // main

// ----------------------------------------------------------------------------

void fillFileASC (FILE* file, int N) {

    double file_size = 100 * pow(2, N); // tamanio del archivo en caracteres.
    
    char ds [] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129456789";
    int p = 0; // Cursor ds
    
    // Cantidad de veces que se debe imprimir el caracter apuntado por p en el archivo.
    long a = floor(file_size / strlen(ds)); 

    int cnt_a = 0; // Cuenta la cantidad de veces que se imprimio un caracter.
    
    while (file_size > 0)
    {
        if (cnt_a == a)
        {
            cnt_a = 0;
            p++;
        }
        else
            cnt_a ++;
        
        fprintf (file, "%c", ds[p]);
        
        file_size --;
    }
    
} // fillFileASC

// ----------------------------------------------------------------------------

void fillFileDESC (FILE* file, int N) {

    double file_size = 100 * pow(2, N); // tamanio del archivo en caracteres.
    
    char ds [] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129456789";
    int p = strlen(ds) - 1; // Cursor ds
    
    // Cantidad de veces que se debe imprimir el caracter apuntado por p en el archivo.
    long a = floor(file_size / strlen(ds)); 

    int cnt_a = 0; // Cuenta la cantidad de veces que se imprimio un caracter.
    
    while (file_size > 0)
    {
        if (cnt_a == a)
        {
            cnt_a = 0;
            p--;
        }
        else
            cnt_a ++;
        
        fprintf (file, "%c", ds[p]);
        
        file_size --;
    }    
    
} // fillFileDESC

void fillFileRANDOM (FILE* file, int N){
    
    double file_size = 100 * pow(2, N); // tamanio del archivo en caracteres.
    
    char ds [] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129456789";
    int p = 0; // Cursor ds
    
    // Cantidad de veces que se debe imprimir el caracter apuntado por p en el archivo.
    long a = floor(file_size / strlen(ds)); 

    int cnt_a = 0; // Cuenta la cantidad de veces que se imprimio un caracter.
    
    while (file_size > 0)
    {
        if (cnt_a == a)
            cnt_a = 0;
        else
            cnt_a ++;
            
        if (p < strlen (ds)-1) p++; else p = 0;

        fprintf (file, "%c", ds[p]);
        
        file_size --;
    } 
     
} // fillFileRANDOM
